package com.notifier.filter;

import com.notifier.event.ErrorEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 关键字过滤器
 * 职责：过滤黑名单中的错误
 *
 * @author Amadeus
 * @date 2025/10/14
 */
@Slf4j
@Component
public class KeywordFilter implements IErrorFilter {
    
    /** 默认黑名单（代码中预置的常见噪音错误） */
    private static final List<String> DEFAULT_BLACKLIST = Arrays.asList(
        "未登录,请登录",
        "ErrorScene",
        "Connection reset",
        "Broken pipe",
        "Read timed out",
        "ClientAbortException",
        "Connection refused"
    );
    
    /** 数据库黑名单（从数据库加载） */
    private List<String> databaseBlacklist = new ArrayList<>();
    
    @Override
    public boolean shouldFilter(ErrorEvent event) {
        String fullMessage = event.getFullErrorMessage();
        if (fullMessage == null) {
            return false;
        }
        
        // TODO: 从数据库查询黑名单
        // databaseBlacklist = loadBlacklistFromDatabase();
        
        // 检查默认黑名单
        for (String keyword : DEFAULT_BLACKLIST) {
            if (fullMessage.contains(keyword)) {
                log.debug("错误消息匹配黑名单关键字：{}，已过滤", keyword);
                return true;
            }
        }
        
        // 检查数据库黑名单
        for (String keyword : databaseBlacklist) {
            if (fullMessage.contains(keyword)) {
                log.debug("错误消息匹配数据库黑名单关键字：{}，已过滤", keyword);
                return true;
            }
        }
        
        return false;
    }
    
    @Override
    public int getOrder() {
        return 3;  // 第三优先级
    }
    
    @Override
    public String getName() {
        return "KeywordFilter";
    }
    
    /**
     * 设置数据库黑名单（供外部调用）
     * 
     * @param blacklist 黑名单列表
     */
    public void setDatabaseBlacklist(List<String> blacklist) {
        if (blacklist != null) {
            this.databaseBlacklist = blacklist;
        }
    }
    
    // TODO: 实现从数据库加载黑名单的方法
    // private List<String> loadBlacklistFromDatabase() {
    //     // 从数据库查询黑名单配置
    //     return new ArrayList<>();
    // }
}

